home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 147 / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin / fdimg / —‹Œêsrc.lzh / window.c < prev    next >
C/C++ Source or Header  |  1993-02-07  |  7KB  |  303 lines

  1. #include    "3DDEF.H"
  2. #include    "GLOBAL.H"
  3. #include    "FORWARD.H"
  4. #include    "XCODE.H"
  5.  
  6. /* カレントのウインドウを設定する */
  7. void
  8. window_set_current(int number)
  9. {
  10.     CWN = number;
  11.  
  12.     CURRENT_TEXT = WDATA[number].WTEXTS;
  13.     HEAD = WDATA[number].WHEADS;
  14.     TAIL = WDATA[number].WTAILS;    /* 頭尾の設定 */
  15.     main_set_view_flag();
  16. /*    window_change00(number);*/
  17. }
  18.  
  19. void
  20. window_loc(int x,int y)
  21. {
  22.     B_CONSOL(0,YDOT[CWY0+y]+LYW_UPPER,XWIDTH-1,0);
  23. /*    B_CONSOL(0,YDOT[CWY0+y],XWIDTH-1,0);*/
  24.     B_LOCATE(CWX0+x,0);
  25. }
  26.  
  27. void
  28. window_abs_loc(int x,int y)
  29. {
  30. /*    B_CONSOL(0,YDOT[y]+LYW_UPPER,XWIDTH-1,0);*/
  31.     B_CONSOL(0,YDOT[y],XWIDTH-1,0);
  32.     B_LOCATE(x,0);
  33. }
  34.  
  35. /* ウインドウの大きさを設定する */
  36. void
  37. window_set_size(int number,int x0,int y0,int x1,int y1)
  38. {
  39.     WDATA[number].WX0 = x0;
  40.     WDATA[number].WY0 = y0;
  41.     WDATA[number].WX1 = x1;
  42.     WDATA[number].WY1 = y1;
  43. }
  44.  
  45. /* w1 から w2 にコピーする */
  46. void
  47. window_dup_window(int w1,int w2)
  48. {
  49.     WDATA[w2] = WDATA[w1];
  50. }
  51.  
  52. /* ウインドウの大きさを変更する */
  53. void
  54. window_change_size(int number,int x0,int y0,int x1,int y1)
  55. {
  56.     if (x0 >= 0) WDATA[number].WX0 = x0;
  57.     if (y0 >= 0) WDATA[number].WY0 = y0;
  58.     if (x1 >= 0) WDATA[number].WX1 = x1;
  59.     if (y1 >= 0) WDATA[number].WY1 = y1;
  60. }
  61.  
  62. /* ウインドウ内のカーソル位置を設定する */
  63. void
  64. window_set_position(int number,int x,int y,int cpx)
  65. {
  66.     WDATA[number].WCX = x;
  67.     WDATA[number].WCY = y;    /* カーソル位置 */
  68.     WDATA[number].WCPX = cpx;
  69. }
  70.  
  71. /* ウインドウにテキストを割り当てる */
  72. window_set_text(int number,int text_number)
  73. {
  74.     WDATA[number].WTEXTS = text_number;
  75.     WDATA[number].WHEADS = &TDATA[text_number].TEXT_HEADS;
  76.     WDATA[number].WTAILS = &TDATA[text_number].TEXT_TAILS;    /* 頭尾の設定 */
  77. }
  78.  
  79. /* カレントをセーブし、number に変える */
  80. /* テキストが変わる事あり */
  81. /* ボトムの書き換えも行う */
  82. void
  83. window_change(int number)/* ,,, */
  84. {
  85.     int cwn0;
  86.  
  87.     cwn0 = CWN;    /* 保存 */
  88.     window_change0(number);
  89.     disp_btm_line(cwn0);
  90.     disp_btm_line(CWN);    /* CWN == number */
  91. }
  92.  
  93. /* カレントをセーブし、number に変える */
  94. /* テキストが変わる事あり */
  95. /* ボトムの書き換えは行わない */
  96. void
  97. window_change0(int number)
  98. {
  99.     if (number == CWN) {
  100.         return;
  101.     }
  102.     window_change00(number);
  103. }
  104.  
  105. void
  106. window_change00(int number)
  107. {
  108.     UNIT *wp;
  109.     int bp,y;
  110.  
  111.     line_seigyou();
  112.  
  113. #if 0
  114.     mark_erase_mark_sys(CWN);/* システムマークを消す,,, */
  115.     mark_set_mark(XCODE_SYSMARK-XCODE_MARK+CURRENT_TEXT);    /* システムマーク */
  116. #endif
  117.     window_set_current(number);
  118.  
  119.     if (wp = mark_get_mark_x(number,XCODE_SYSMARK-XCODE_MARK+number,&bp)) {
  120. /*    if (wp = mark_get_mark(XCODE_SYSMARK-XCODE_MARK,&bp)) {*/
  121. #if 0                                 /* マークが存在した */
  122.         mark_erase_mark_sys(number);/* システムマークを消す */
  123. #endif
  124. #if 1
  125.         mark_set_mark(XCODE_SYSMARK-XCODE_MARK+CWN);    /* システムマーク */
  126. #endif
  127. /*        window_set_current(number);*/
  128. /*        CWN = number;*/
  129.         CL = wp;
  130.         line_cl_cl();
  131.         if ((y = window_is_this_line_in_current(CL)) < 0) {    /* 入ってない */
  132.             disp_cl_center();
  133.         } else {
  134.             CY = y;
  135.         }
  136.         work_line_analyze();
  137.         CPX = work_byte_to_CPX(bp);
  138.         CX0 = CX = ANALYZE[CPX].XPOS;
  139.         work_cursor_cpx();
  140.     } else {    /* マークがない */
  141.         CL = HEAD->ATO;
  142.         line_cl_cl();
  143.         CY = CX0 = CX = CPX = 0;
  144.         disp_cl_center();
  145.         work_line_analyze();
  146.         work_cursor_cpx();
  147.     }
  148. }
  149.  
  150. /* カレントをセーブする */
  151. void
  152. window_save()
  153. {
  154.     WDATA[CWN].WCX = CX;
  155.     WDATA[CWN].WCY = CY;
  156.     WDATA[CWN].WCPX = CPX;
  157.     WDATA[CWN].WX0 = CWX0;
  158.     WDATA[CWN].WY0 = CWY0;
  159.     WDATA[CWN].WX1 = CWX1;
  160.     WDATA[CWN].WY1 = CWY1;
  161.  
  162.     WDATA[CWN].WTEXTS = CURRENT_TEXT;
  163.     WDATA[CWN].WHEADS = HEAD;
  164.     WDATA[CWN].WTAILS = TAIL;    /* 頭尾の設定 */
  165.  
  166.     window_loc(CX,CY);
  167.  
  168.     line_cl_cl();
  169. }
  170.  
  171. /* その行がカレントウインドウの中にあるかどうかを調べる */
  172. /* あったなら相対的なY座標、なければ-1を返す */
  173. int
  174. window_is_this_line_in_current(UNIT *up)
  175. {
  176.     register int y;
  177.     register int rety;
  178.  
  179.     for(rety = 0,y = CWY0;y <= CWY1;y++,rety++) {
  180.         if (SCREEN[y] == up) return(rety);
  181.     }
  182.     return(-1);
  183. }
  184.  
  185. #if 0
  186. /* その行が w 番ウインドウの中にあるかどうかを調べる */
  187. /* あったなら相対的なY座標、なければ-1を返す */
  188. int
  189. window_is_this_line_in_x(int w,UNIT *up)
  190. {
  191.     register int y;
  192.     register int rety;
  193.  
  194.     for(rety = 0,y = WDATA[w].WY0;y <= WDATA[w].WY1;y++,rety++) {
  195.         if (SCREEN[y] == up) return(rety);
  196.     }
  197.     return(-1);
  198. }
  199. #endif
  200.  
  201. /* w のウインドウのシステム */
  202. void
  203. window_check_cursor(int w)
  204. {
  205.     int w0;
  206.  
  207.     w0 = CWN;
  208.     window_change0(w);
  209.     window_change0(w0);    /* 戻す */
  210. }
  211.  
  212. window0()
  213. {
  214.     B_CONSOL(0,0,XWIDTH0-1,YWIDTH0-1);
  215. }
  216.  
  217. int
  218. window_get_free_window_number()
  219. {
  220.     register int i;
  221.  
  222.     for(i = 0;i < MAX_WINDOW;i++) {
  223.         if (WDATA[i].WX0 < 0) {    /* 無効なのを見付けた */
  224.             return(i);
  225.         }
  226.     }
  227.     return(-1);    /* 無い */
  228. }
  229.  
  230. int
  231. window_get_free_text_number()
  232. {
  233.     register int i;
  234.  
  235.     for(i = 0;i < MAX_TEXT;i++) {
  236.         if (TDATA[i].TEXT_FILE < 0) {    /* 無効なのを見付けた */
  237.             return(i);
  238.         }
  239.     }
  240.     return(-1);    /* 無い */
  241. }
  242.  
  243. /* list の中にフラグをセットして返す */
  244. /* 指定のテキスト番号を扱っているウインドウ番号を返す */
  245. /* リターンバリューはウィンドウの個数 */
  246. int
  247. window_which_has_text_number(int t,STR list)
  248. {
  249.     register int i,s=0;
  250.  
  251.     for(i=0;i<MAX_WINDOW;i++) {
  252.         s += (list[i] = (WDATA[i].WTEXTS == t));
  253.     }
  254.     return(s);
  255. }
  256.  
  257. /* w1 = 上のウインドウ、w2 = 下のウインドウ */
  258. /* w1 の行数が delta だけ変わる */
  259. /* delta はマイナス可 */
  260. /* 実現出来たら1を返す */
  261. int
  262. window_2_change_size(int w1,int w2,int delta)
  263. {
  264.     int dw1,dw2;
  265.     int y11,y02;
  266.     UNIT *wp;
  267.  
  268.     dw1 = (y11 = WDATA[w1].WY1) - WDATA[w1].WY0 + 1;    /* 上のウインドウの幅 */
  269.     dw2 = WDATA[w2].WY1 - (y02 = WDATA[w2].WY0) + 1;    /* 下のウインドウの幅 */
  270.     if (((dw1 += delta) > 0) && ((dw2 -= delta) > 0)) {
  271.         line_seigyou();
  272.         /* 必要な行数だけやりとりできる */
  273.         wp = line_x_screen(w2,0);            /* 下の一番上の行 */
  274.         window_change_size(w1,-1,-1,-1,y11+delta);    /* 上の大きさ */
  275.         window_change_size(w2,-1,y02+delta,-1,-1);    /* 下の大きさ */
  276.  
  277.         if (delta > 0) {    /* 上が大きくなる */
  278.             disp_window_top_flush(w1,line_x_screen(w1,0));
  279.                     /* 下が小さくなるので、カーソルが隠れる可能性あり */
  280.             if (w2 != CWN) {
  281.                 window_check_cursor(w2);
  282.             } else {
  283.                 window_change0(w1);
  284.                 window_change(w2);    /* 戻す */
  285.             }
  286.         } else {        /* 下が大きくなる */
  287.             wp = line_trace(wp,delta,(int *) NULL);
  288.             disp_window_top_flush(w2,wp);
  289.             disp_btm_line(w1);
  290.                     /* 上が小さくなるので、カーソルが隠れる可能性あり */
  291.             if (w1 != CWN) {
  292.                 window_check_cursor(w1);
  293.             } else {
  294.                 window_change0(w2);
  295.                 window_change(w1);    /* 戻す */
  296.             }
  297.         }
  298.         return(1);
  299.     } else {
  300.         return(0);
  301.     }
  302. }
  303.